package cjlu.ea.h.apiImpl;

import cjlu.ea.h.api.ExcelApi;
import cjlu.ea.h.entity.Bjxx;
import cjlu.ea.h.entity.ByszgshbLsb;
import cjlu.ea.h.entity.DBsyxwsqb;
import cjlu.ea.h.entity.DBysfxshb;
import cjlu.ea.h.entity.vo.statistics.F1011Vo;
import cjlu.ea.h.entity.vo.statistics.F1012Vo;
import cjlu.ea.h.entity.vo.statistics.F1013Vo;
import cjlu.ea.h.entity.vo.statistics.F1014Vo;
import cjlu.ea.h.service.*;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

@Component
@Slf4j
public class ExcelApiImpl implements ExcelApi {

    @Autowired
    F101ByszgshbLsbService f101ByszgshbLsbService;
    @Autowired
    F102DBsyxwsqbService dBsyxwsqbService;
    @Autowired
    F103DBysfxshbService dBysfxshbService;
    @Autowired
    F201BjxxService bjxxService;
    @Autowired
    StatisticsService statisticsService;


    @Override
    public Boolean F101Export(HttpServletResponse response,
                              ByszgshbLsb byszgshbLsb) {

        QueryWrapper<ByszgshbLsb> wrapper = new QueryWrapper<>();

        //条件查询
        if(!StringUtils.isEmpty(byszgshbLsb.getXh())){//学号
            wrapper.likeRight("xh",byszgshbLsb.getXh());
        }
        if(byszgshbLsb.getXm()!=null){//姓名
            wrapper.likeRight("xm",byszgshbLsb.getXm());
        }
        if(byszgshbLsb.getXy()!=null){//学院
            wrapper.likeRight("xy",byszgshbLsb.getXy());
        }
        if(byszgshbLsb.getBh()!=null){//班级
            wrapper.likeRight("bh",byszgshbLsb.getBh());
        }
        if(byszgshbLsb.getZyh()!=null){//专业
            wrapper.likeRight("zyh",byszgshbLsb.getZyh());
        }
        if(byszgshbLsb.getBz()!=null){//状态
            wrapper.eq("bz",byszgshbLsb.getBz());
        }
        if(byszgshbLsb.getByzg()!=null){//毕业资格
            wrapper.eq("byzg",byszgshbLsb.getByzg());
        }
        if(byszgshbLsb.getXwzg()!=null){//学位资格
            wrapper.eq("xwzg",byszgshbLsb.getXwzg());
        }
        List<ByszgshbLsb> rows = f101ByszgshbLsbService.list(wrapper);

        System.out.println("要导出的用户列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(17, "学生信息");

        writer.addHeaderAlias("xh","学号");
        writer.addHeaderAlias("xm","姓名");
        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("zyh","专业");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("bjg","不及格课程");
        writer.addHeaderAlias("ggxx","公共选修");
        writer.addHeaderAlias("tsxx","特色选修");
        writer.addHeaderAlias("xkxx","学科选修");
        writer.addHeaderAlias("zyxx","专业选修");
        writer.addHeaderAlias("kwxx","课外选修");
        writer.addHeaderAlias("wygt","外语沟通");
        writer.addHeaderAlias("jd","平均绩点");
        writer.addHeaderAlias("xwjd","学位绩点");
        writer.addHeaderAlias("wj","违纪行为");
        writer.addHeaderAlias("byzg","毕业资格");
        writer.addHeaderAlias("xwzg","学位资格");
        writer.addHeaderAlias("bz","状态");


        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=学生信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;
    }

    @Override
    public Boolean F101Import(MultipartFile file) {
        InputStream in = null;
        ExcelReader excelReader = null;
        try {
            in = file.getInputStream();
            excelReader=ExcelUtil.getReader(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
//        //io流给ExcelReader

//        //读取数据且转化为list
//        List<User> list = excelReader.readAll(User.class);

        //2.第二种导入方式
        //忽略第一行标题和第二行属性名(第一行是中文的情况),直接读取表的内容
        List<List<Object>> list = excelReader.read(2);
        List<ByszgshbLsb> listBys= CollUtil.newArrayList();
        for (List<Object> row: list) {
            ByszgshbLsb bys=new ByszgshbLsb();
            bys.setXh(row.get(0).toString());
            bys.setXm(row.get(1).toString());
            bys.setXy(row.get(2).toString());
            bys.setZyh(row.get(3).toString());
            bys.setBh(row.get(4).toString());
            bys.setBjg(row.get(5).toString());
            bys.setGgxx(row.get(6).toString());
            bys.setTsxx(row.get(7).toString());
            bys.setXkxx(row.get(8).toString());
            bys.setZyxx(row.get(9).toString());
            bys.setKwxx(row.get(10).toString());
            bys.setWygt(row.get(11).toString());
            bys.setJd(row.get(12).toString());
            bys.setXwjd(row.get(13).toString());
            bys.setWj(row.get(14).toString());
            bys.setByzg(row.get(15).toString());
            bys.setXwzg(row.get(16).toString());
            bys.setBz(row.get(17).toString());

            //系统审核判断毕业资格
            if(bys.getJd().equals("")||bys.getXwjd().equals("")){
                System.out.println("绩点不能为空");
                return false;
            }

            //1.无毕业资格和学位资格，无法毕业
            if ((Double.parseDouble(bys.getJd()) < 2.0 || Double.parseDouble(bys.getXwjd()) < 2.0)
                    && (!"".equals(bys.getKwxx().trim()) || !"".equals(bys.getXkxx().trim())
                    || !"".equals(bys.getZyxx().trim()) || !"".equals(bys.getGgxx().trim())
                    || !"".equals(bys.getTsxx().trim()) || !"".equals(bys.getBjg().trim()))) {//绩点有小于2.0的，并且有不及格课程

                bys.setByzg("无");
                bys.setXwzg("无");

                if (!"结业".equals(bys.getBz()) || !"延长".equals(bys.getBz())) {
                    bys.setBz("结业");
                }
            }
            //无毕业资格，可能有学位资格，无法毕业
            if ((Double.parseDouble(bys.getJd()) < 2.0 || Double.parseDouble(bys.getXwjd()) < 2.0)
                    || (!"".equals(bys.getKwxx().trim()) || !"".equals(bys.getXkxx().trim())
                    || !"".equals(bys.getZyxx().trim()) || !"".equals(bys.getGgxx().trim())
                    || !"".equals(bys.getTsxx().trim()) || !"".equals(bys.getBjg().trim()))) {

                bys.setByzg("无");

                if (!"结业".equals(bys.getBz()) || !"延长".equals(bys.getBz())) {
                    bys.setBz("结业");
                }
            }

            //可以毕业，可能有违纪
            if ((Double.parseDouble(bys.getJd()) > 2.0 && Double.parseDouble(bys.getXwjd()) > 2.0)
                    && ("".equals(bys.getKwxx().trim()) && "".equals(bys.getXkxx().trim())
                    && "".equals(bys.getZyxx().trim()) && "".equals(bys.getGgxx().trim())
                    && "".equals(bys.getTsxx().trim()) && "".equals(bys.getBjg().trim()))) {//绩点都大于2.0，无不及格课程
                bys.setByzg("有");
                if (!"".equals(bys.getWj())) {
                    bys.setXwzg("无");
                } else {
                    bys.setXwzg("有");
                    if ("结业".equals(bys.getBz()) || "延长".equals(bys.getBz())) {
                        bys.setBz("毕业");
                    }
                }

            }
            //无学位资格，可能有毕业资格，可能毕业
            if(!bys.getWj().equals("")){
                bys.setXwzg("无");
            }

            //最后判断有无毕业状态
            if(bys.getByzg().equals("无")){
                bys.setXwzg("无");
                if(!bys.getBz().equals("结业")||!bys.getBz().equals("延长")){
                    bys.setBz("结业");
                }
            }
            bys.setGmtCreate(new Date());
            bys.setGmtModified(new Date());

            listBys.add(bys);
//            ****类似一一对应****
        }
        //批量注册进数据库

        f101ByszgshbLsbService.SaveOrUpdateByXh(listBys);

        return true;
    }

    @Override
    public Boolean F102Export(HttpServletResponse response, DBsyxwsqb dBsyxwsqb) {

        QueryWrapper<DBsyxwsqb> wrapper = new QueryWrapper<>();

        //条件查询
        if(!StringUtils.isEmpty(dBsyxwsqb.getXh())){//学号
            wrapper.likeRight("xh",dBsyxwsqb.getXh());
        }
        if(dBsyxwsqb.getXm()!=null){//姓名
            wrapper.likeRight("xm",dBsyxwsqb.getXm());
        }
        if(dBsyxwsqb.getXy()!=null){//学院
            wrapper.likeRight("xy",dBsyxwsqb.getXy());
        }
        if(dBsyxwsqb.getBh()!=null){//班级
            wrapper.likeRight("bh",dBsyxwsqb.getBh());
        }


        List<DBsyxwsqb> rows = dBsyxwsqbService.list(wrapper);

        System.out.println("要导出的用户列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(9, "学生信息");

        writer.addHeaderAlias("xh","学号");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("xm","姓名");
        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("yy","原因");
        writer.addHeaderAlias("cfsj","处罚时间");
        writer.addHeaderAlias("sqly","申请理由");
        writer.addHeaderAlias("fhtk","参照条款");
        writer.addHeaderAlias("shfs","审核方式");
        writer.addHeaderAlias("shjg","审核结果");



        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=学生信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;


    }

    @Override
    public Boolean F102Import(MultipartFile file) {
        InputStream in = null;
        ExcelReader excelReader = null;
        try {
            in = file.getInputStream();
            excelReader=ExcelUtil.getReader(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
//        //io流给ExcelReader

//        //读取数据且转化为list
//        List<User> list = excelReader.readAll(User.class);

        //2.第二种导入方式
        //忽略第一行标题和第二行属性名(第一行是中文的情况),直接读取表的内容
        List<List<Object>> list = excelReader.read(2);
        List<DBsyxwsqb> listBys= CollUtil.newArrayList();
        for (List<Object> row: list) {
            DBsyxwsqb bys=new DBsyxwsqb();
            bys.setXh(row.get(0).toString());
            bys.setXm (row.get(1).toString());
            bys.setBh(row.get(2).toString());
            bys.setXy(row.get(3).toString());
            bys.setYy(row.get(4).toString());
            bys.setCfsj(row.get(5).toString());
            bys.setSqly(row.get(6).toString());
            bys.setFhtk(row.get(7).toString());
            bys.setShfs(row.get(8).toString());
            bys.setShjg(row.get(9).toString());
            bys.setGmtCreate(new Date());
            bys.setGmtModified(new Date());
            listBys.add(bys);
//            ****类似一一对应****
        }
        //批量注册进数据库

        dBsyxwsqbService.SaveOrUpdateByXh(listBys);

        return true;
    }

    @Override
    public Boolean F103Export(HttpServletResponse response, DBysfxshb dBysfxshb) {
        QueryWrapper<DBysfxshb> wrapper = new QueryWrapper<>();

        //条件查询
        if(!StringUtils.isEmpty(dBysfxshb.getXh())){//学号
            wrapper.likeRight("xh",dBysfxshb.getXh());
        }
        if(dBysfxshb.getXm()!=null){//姓名
            wrapper.likeRight("xm",dBysfxshb.getXm());
        }
        if(dBysfxshb.getXy()!=null){//学院
            wrapper.likeRight("xy",dBysfxshb.getXy());
        }
        if(dBysfxshb.getBh()!=null){//班级
            wrapper.likeRight("bh",dBysfxshb.getBh());
        }
        if(dBysfxshb.getDyzyzg()!=null){//第一专业毕业资格
            wrapper.likeRight("dyzyzg",dBysfxshb.getDyzyzg());
        }
        if(dBysfxshb.getDyzyxwzg()!=null){//第一专业学位资格
            wrapper.likeRight("dyzyxwzg",dBysfxshb.getDyzyxwzg());
        }
        if(dBysfxshb.getSzybyzg()!=null){//第二专业毕业资格
            wrapper.likeRight("szybyzg",dBysfxshb.getSzybyzg());
        }
        if(dBysfxshb.getSxwxwzg()!=null){//第二专业学位资格
            wrapper.likeRight("sxwxwzg",dBysfxshb.getSxwxwzg());
        }


        List<DBysfxshb> rows = dBysfxshbService.list(wrapper);

        System.out.println("要导出的用户列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(13, "学生信息");

        writer.addHeaderAlias("xh","学号");
        writer.addHeaderAlias("xm","姓名");
        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("zyh","专业");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("bjg","历年不及格课程");
        writer.addHeaderAlias("xx","选修课");
        writer.addHeaderAlias("jd","绩点");
        writer.addHeaderAlias("wj","违纪类型");
        writer.addHeaderAlias("dyzyzg","第一专业毕业资格");
        writer.addHeaderAlias("dyzyxwzg","第一专业学位资格");
        writer.addHeaderAlias("szybyzg","第二专业毕业资格");
        writer.addHeaderAlias("sxwxwzg","第二专业学位资格");
        writer.addHeaderAlias("bz","备注");


        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=学生信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;
    }

    @Override
    public Boolean F103Import(MultipartFile file) {
        InputStream in = null;
        ExcelReader excelReader = null;
        try {
            in = file.getInputStream();
            excelReader=ExcelUtil.getReader(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
//        //io流给ExcelReader

//        //读取数据且转化为list
//        List<User> list = excelReader.readAll(User.class);

        //2.第二种导入方式
        //忽略第一行标题和第二行属性名(第一行是中文的情况),直接读取表的内容
        List<List<Object>> list = excelReader.read(2);
        List<DBysfxshb> listBys= CollUtil.newArrayList();
        for (List<Object> row: list) {
            DBysfxshb bys=new DBysfxshb();
            bys.setXh(row.get(0).toString());
            bys.setXm(row.get(1).toString());
            bys.setXy(row.get(2).toString());
            bys.setZyh(row.get(3).toString());
            bys.setBh(row.get(4).toString());
            bys.setBjg(row.get(5).toString());
            bys.setXx(row.get(6).toString());
            bys.setJd(row.get(7).toString());
            bys.setWj(row.get(8).toString());
            bys.setDyzyzg(row.get(9).toString());
            bys.setDyzyxwzg(row.get(10).toString());
            bys.setSzybyzg(row.get(11).toString());
            bys.setSxwxwzg(row.get(12).toString());
            if (row.size()>13){
                bys.setBz(row.get(13).toString());
            }
            bys.setGmtCreate(new Date());
            bys.setGmtModified(new Date());
            listBys.add(bys);
//            ****类似一一对应****
        }
        //批量注册进数据库

        dBysfxshbService.SaveOrUpdateByXh(listBys);

        return true;
    }


    @Override
    public Boolean F201Export(HttpServletResponse response, Bjxx bjxx) {

        QueryWrapper<Bjxx> wrapper = new QueryWrapper<>();

        //条件查询
        if(bjxx.getXymc()!=null){//学院
            wrapper.likeRight("xymc",bjxx.getXymc());
        }
        if(bjxx.getZymc()!=null){//专业
            wrapper.likeRight("zymc",bjxx.getZymc());
        }
        if(bjxx.getBjmc()!=null){//班级
            wrapper.likeRight("bjmc",bjxx.getBjmc());
        }


        List<Bjxx> rows = bjxxService.list(wrapper);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(2, "班级信息");

        writer.addHeaderAlias("xymc","学院");
        writer.addHeaderAlias("zymc","专业");
        writer.addHeaderAlias("bjmc","班级");



        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=学生信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;
    }

    @Override
    public Boolean F201Import(MultipartFile file) {
        InputStream in = null;
        ExcelReader excelReader = null;
        try {
            in = file.getInputStream();
            excelReader=ExcelUtil.getReader(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
//        //io流给ExcelReader

//        //读取数据且转化为list
//        List<User> list = excelReader.readAll(User.class);

        //2.第二种导入方式
        //忽略第一行标题和第二行属性名(第一行是中文的情况),直接读取表的内容
        List<List<Object>> list = excelReader.read(2);
        List<Bjxx> listBj= CollUtil.newArrayList();
        for (List<Object> row: list) {
            Bjxx bj=new Bjxx();
            bj.setXymc(row.get(0).toString());
            bj.setZymc(row.get(1).toString());
            bj.setBjmc(row.get(2).toString());
            listBj.add(bj);
//            ****类似一一对应****
        }
        //批量注册进数据库

        bjxxService.saveBatch(listBj);

        return true;
    }



    @Override
    public Boolean F1011Export(HttpServletResponse response, Bjxx bjxx) {

        log.info("查询导出条件：" + bjxx);
        List<F1011Vo> rows = statisticsService.F1011Statistics(bjxx);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(6, "毕业生毕业率、学位率统计表");

        writer.addHeaderAlias("xy","二级学院");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("zrs","总人数");
        writer.addHeaderAlias("bys","毕业生人数");
        writer.addHeaderAlias("byl","毕业率");
        writer.addHeaderAlias("xwrs","学位人数");
        writer.addHeaderAlias("xwl","学位率");

        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=学生毕业率信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;

    }

    @Override
    public Boolean F1012Export(HttpServletResponse response, Bjxx bjxx) {

        log.info("查询导出条件：" + bjxx);
        List<F1012Vo> rows = statisticsService.F1012Statistics(bjxx);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(4, "毕业生学位绩点未到2.0统计表");

        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("xh","学号");
        writer.addHeaderAlias("xm","姓名");
        writer.addHeaderAlias("jd","绩点");

        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=学位绩点未到2.0学生信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;

    }

    @Override
    public Boolean F1013ListExport(HttpServletResponse response, Bjxx bjxx) {

        log.info("查询导出条件：" + bjxx);
        List<ByszgshbLsb> rows = statisticsService.F1013List(bjxx);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(4, "结业生统计表");

        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("xh","学号");
        writer.addHeaderAlias("xm","姓名");
        writer.addHeaderAlias("bjg","历年不及格");

        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=结业学生信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;

    }

    @Override
    public Boolean F1013Export(HttpServletResponse response, Bjxx bjxx) {

        log.info("查询导出条件：" + bjxx);
        List<F1013Vo> rows = statisticsService.F1013Statistics(bjxx);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(3, "各学院结业率统计表");

        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("rs","人数");
        writer.addHeaderAlias("zrs","总人数");
        writer.addHeaderAlias("bl","比例");


        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=各学院结业率信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;

    }

    @Override
    public Boolean F1014ListExport(HttpServletResponse response, Bjxx bjxx) {

        log.info("查询导出条件：" + bjxx);
        List<ByszgshbLsb> rows = statisticsService.F1014List(bjxx);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(4, "结业生统计表");

        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("xh","学号");
        writer.addHeaderAlias("xm","姓名");
        writer.addHeaderAlias("bjg","历年不及格");

        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=延长学生信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;
    }

    @Override
    public Boolean F1014Export(HttpServletResponse response, Bjxx bjxx) {
        log.info("查询导出条件：" + bjxx);
        List<F1014Vo> rows = statisticsService.F1014Statistics(bjxx);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(3, "各学院结业率统计表");

        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("rs","人数");
        writer.addHeaderAlias("zrs","总人数");
        writer.addHeaderAlias("bl","比例");


        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=各学院延长率信息.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;
    }

    @Override
    public Boolean F1015ListExport(HttpServletResponse response, Bjxx bjxx) {
        log.info("查询导出条件：" + bjxx);
        List<ByszgshbLsb> rows = statisticsService.F1015List(bjxx);

        System.out.println("要导出的班级列表"+rows);

        // 通过工具类创建writer
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 合并单元格后的标题行，使用默认标题样式
        writer.merge(6, "在修学生名单汇总表");

        writer.addHeaderAlias("xy","学院");
        writer.addHeaderAlias("bh","班级");
        writer.addHeaderAlias("xh","学号");
        writer.addHeaderAlias("xm","姓名");
        writer.addHeaderAlias("bjg","历年不及格");
        writer.addHeaderAlias("jd","绩点");
        writer.addHeaderAlias("bz","状态");

        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);

        writer.createCellStyle();

        System.out.println("数据写入write");

        //out为OutputStream，需要写出到的目标流

        // response为HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset:utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename=在修学生名单汇总表.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.flush(out, true);

        // 关闭writer，释放内存
        writer.close();

        //此处记得关闭输出Servlet流
        IoUtil.close(out);
        System.out.println("后台导出成功");

        return true;
    }

}
